home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / docs / ippon / ver / 008 / ippon008.lzh / enemy.c next >
C/C++ Source or Header  |  2000-07-07  |  4KB  |  194 lines

  1. /* enemy.c */
  2.  
  3. #include <stdio.h>
  4. #include <xsp2lib.h>
  5.  
  6. #include "main.h"
  7. #include "player.h"
  8. #include "enemy.h"
  9.  
  10. #define ENEMY_MAX    32    /* 敵最大数 */
  11.  
  12. static ENEMY enemy[ENEMY_MAX];    /* ワーク */
  13. static ENEMY *enemy_top,    /* 使用中のワークのリスト */
  14.  *enemy_null_top,        /* 空のワークのリスト */
  15.  *enemy_end;            /* 使用中ワークのリストの末尾 */
  16.  
  17.  
  18. /* 関数プロトタイプ宣言 */
  19. void EnemyAllocA (ENEMY *);
  20. int EnemyMoveA (ENEMY *);
  21. void EnemyAllocB (ENEMY *);
  22. int EnemyMoveB (ENEMY *);
  23.  
  24.  
  25. /* 初期化関数へのポインタの配列 */
  26. typedef void (*enemy_alloc) (ENEMY *);
  27. enemy_alloc EnemyAllocFunc[] =
  28. {
  29.     EnemyAllocA,
  30.     EnemyAllocB,
  31. };
  32.  
  33. /* 移動関数へのポインタの配列 */
  34. typedef int (*enemy_move) (ENEMY *);
  35. enemy_move EnemyMoveFunc[] =
  36. {
  37.     EnemyMoveA,
  38.     EnemyMoveB,
  39. };
  40.  
  41.  
  42. /* タイプAの敵の初期化ルーチン */
  43. void EnemyAllocA (ENEMY * p)
  44. {
  45.     p->pt = obj_zako02 + 15;
  46.     p->info = 0x0700 | PRIORITY_ZAKO;    /* 数値を決めうちして入れるのはよくない */
  47. }
  48.  
  49. /* タイプAの敵の移動ルーチン */
  50. int EnemyMoveA (ENEMY * p)
  51. {
  52.     /* 敵をくるくる回すアニメーション */
  53.     p->pt--;
  54.     if (p->pt < obj_zako02)
  55.         p->pt = obj_zako02 + 15;
  56.  
  57.     /* X座標を自機に近づける */
  58.     if (p->lx > player->lx)
  59.         p->lx -= 32768;
  60.     else
  61.         p->lx += 32768;
  62.  
  63.     p->ly += 2 * 65536;
  64.  
  65.     return (0);
  66. }
  67.  
  68.  
  69. /* タイプBの敵の初期化ルーチン */
  70. void EnemyAllocB (ENEMY * p)
  71. {
  72.     p->pt = obj_zako02;
  73.     p->info = 0x0800 | PRIORITY_ZAKO;    /* 数値を決めうちして入れるのはよくない */
  74. }
  75.  
  76. /* タイプBの敵の移動ルーチン */
  77. int EnemyMoveB (ENEMY * p)
  78. {
  79.     /* 敵をくるくる回すアニメーション */
  80.     p->pt++;
  81.     if (p->pt > obj_zako02 + 15)
  82.         p->pt = obj_zako02;
  83.  
  84.  
  85.     /* X座標を自機に近づける */
  86.     if (p->lx > player->lx)
  87.         p->lx -= 32768;
  88.     else
  89.         p->lx += 32768;
  90.  
  91.     p->ly += 2 * 65536;
  92.  
  93.     return (0);
  94. }
  95.  
  96.  
  97.  
  98. /* ゲーム開始時に呼ばれる */
  99. void EnemyInit (void)
  100. {
  101.     int i;
  102.  
  103.     /* リストをつなげる */
  104.     enemy_top = NULL;
  105.     enemy_end = NULL;
  106.     enemy_null_top = enemy;
  107.     for (i = 0; i < ENEMY_MAX; i++)
  108.         enemy[i].next = &enemy[i + 1];
  109.  
  110.     enemy[ENEMY_MAX - 1].next = NULL;
  111. }
  112.  
  113.  
  114.  
  115. /* 敵出現時に呼ばれる */
  116. void EnemyAlloc (short type, signed short x, signed short y)
  117. {
  118.     ENEMY *p;
  119.  
  120.     if (enemy_null_top == NULL)
  121.         return;        /* 空きのワークがない(キャラクターオーバー) */
  122.  
  123.     /* リストの末尾に新しいノードを追加(他とは違うので注意) */
  124.     p = enemy_null_top;
  125.     enemy_null_top = p->next;
  126.     if (enemy_top == NULL)
  127.         enemy_top = p;
  128.     else
  129.         enemy_end->next = p;
  130.     p->next = NULL;
  131.     enemy_end = p;
  132.  
  133.     p->type = type;
  134.     p->lx = x << 16;
  135.     p->ly = y << 16;
  136.  
  137.     /* 関数へのポインタを使って分岐 */
  138.     /* type が 0 なら EnemyAllocA() が、1 なら EnemyAllocB() が実行される */
  139.     EnemyAllocFunc[p->type] (p);
  140.  
  141.     return;
  142. }
  143.  
  144.  
  145.  
  146. /* 垂直同期ごとに呼ばれる */
  147. void EnemyMove (void)
  148. {
  149.     ENEMY *p, *q;
  150.  
  151.     p = enemy_top;        /* 現在注目しているワーク */
  152.     q = NULL;        /* 1つ前のワーク(ワーク削除時に必要) */
  153.     while (p != NULL) {
  154.         /* 敵キャラの移動ルーチン */
  155.  
  156.         /* 関数へのポインタを使って分岐 */
  157.         /* type が 0 なら EnemyMoveA() が、1 なら EnemyMoveB() が実行される */
  158.         EnemyMoveFunc[p->type] (p);
  159.  
  160.  
  161.         /* 上位ワード(固定整数部)だけ取り出す */
  162.         p->x = p->lx >> 16;
  163.         p->y = p->ly >> 16;
  164.  
  165.         if (p->y > 256 + 32) {    /* Y座標が 256+32 以上なら消去 */
  166.             if (q == NULL) {    /* リストの一番最初を削除 */
  167.                 enemy_top = p->next;
  168.                 p->next = enemy_null_top;
  169.                 enemy_null_top = p;
  170.                 q = NULL;
  171.                 p = enemy_top;
  172.             } else {
  173.                 if (p == enemy_end) {    /* リストの一番最後を削除 */
  174.                     q->next = NULL;
  175.                     enemy_end = q;
  176.                     p->next = enemy_null_top;
  177.                     enemy_null_top = p;
  178.                     p = q->next;
  179.                 } else {
  180.                     q->next = p->next;
  181.                     p->next = enemy_null_top;
  182.                     enemy_null_top = p;
  183.                     p = q->next;
  184.                 }
  185.             }
  186.         } else {
  187.             xobj_set_st (p);    /* 表示 */
  188.             q = p;
  189.             p = p->next;
  190.         }
  191.     }
  192.  
  193. }
  194.